package com.yangxf.f_sequenceflow;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class SequenceFlowTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploymentProcessDefinition_inputstream() {
		
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png");
		
		Deployment deployment = processEngine.getRepositoryService() // 流程定义、部署对象 所使用的service
				.createDeployment() // 创建部署对象
				.name("连线") // 输入框 部署名称 67501
				.addInputStream("sequenceFlow.bpmn", inputStreamBpmn)
				.addInputStream("sequenceFlow.png", inputStreamPng)
				.deploy(); // 完成部署
		
		System.out.println("部署id："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**
	 * 启动流程实例 70001
	 */
	@Test
	public void startProcessInstance() {
		
		String processDefinitionKey = "sequenceFlow";
		
		ProcessInstance pi = processEngine.getRuntimeService() // 与正在执行的流程实例和执行对象相关的service
			.startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id属性的值
		 
		System.out.println("流程实例id："+pi.getId()); // 流程实例id 25001
		System.out.println("流程定义id："+pi.getProcessDefinitionId()); // 流程定义id helloworld:5:22504
	}
	
	/**
	 * 查询当前的个人任务
	 */
	@Test
	public void findMyOwnTask() {
		
		String name = "赵六";
		
		List<Task> list = processEngine.getTaskService() // 与正在执行的任务管理相关的service
			.createTaskQuery() // 创建任务查询对象
			.taskAssignee(name) // 个人任务查询指定 查询人
//			.taskCandidateUser() // 组任务办理人查询
//			.processDefinitionId() // 使用流程定义id查询
//			.processInstanceId() // 使用流程实例id查询
//			.executionId() // 使用执行对象id查询
//			.singleResult() // 返回唯一记录
//			.count() // 返回结果集的数量
//			.listPage(, ) // 分页查询
			.list(); // 
		
		if(list!=null && list.size()>0) {
			for(Task task:list) {
				System.out.println("任务id："+task.getId());
				System.out.println("任务名称："+task.getName());
				System.out.println("任务创建时间："+task.getCreateTime());
				System.out.println("任务办理人："+task.getAssignee());
				System.out.println("流程实例id："+task.getProcessInstanceId());
				System.out.println("执行对象id："+task.getExecutionId());
				System.out.println("流程定义id："+task.getProcessDefinitionId());
			}
		}
	
	}
	
	/**
	 * 完成我的任务
	 */
	@Test
	public void finishMyTask() {
		
		String taskId = "70004";
		Map<String,Object> variables = new HashMap<String,Object>();
		variables.put("message", "不重要");
		
		//完成任务同时 设置流程变量 
		processEngine.getTaskService() // 正在执行的任务使用的service #{message=="不重要"} 70004
			.complete(taskId, variables);
		
		System.out.println("完成任务：任务id是："+taskId);
	}
	
	
}
